#include <ros/ros.h>
#include <pcl/point_cloud.h>
#include <pcl_conversions/pcl_conversions.h>
#include <pcl/filters/passthrough.h>
#include <pcl/point_types.h>  
#include <pcl/io/pcd_io.h>  
#include <pcl/visualization/pcl_visualizer.h>  

#include <X11/Xlib.h> // 包含 X11 库的头文件
#include <X11/Xutil.h>

int main(int argc, char** argv)  
{  
 // 初始化 Xlib  
    XInitThreads(); // 这是关键的一行  
    Display *display = XOpenDisplay(NULL); 

  // 读取点云数据  
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);  
  pcl::io::loadPCDFile<pcl::PointXYZ>("./pointsData/Horse.pcd", *cloud);  
  std::cout << "点云文件中有 " << cloud->size() << " 个点" << std::endl;  // 输出点数
  // 创建直通滤波器
    pcl::PassThrough<pcl::PointXYZ> pass;
    pass.setInputCloud(cloud);
    pass.setFilterFieldName("x");  // 指定过滤的字段为z坐标
    pass.setFilterLimits(0.0, 1.0);  // 指定过滤范围为0到1之间的点
    pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pass.filter(*filtered_cloud);
    pcl::io::savePCDFileASCII("filteredPointData/filtered_cloud.pcd", *filtered_cloud); // 保存为PCD格式
    std::cout << "滤波后有 " << filtered_cloud->size() << " 个点" << std::endl;  // 输出点数
 /// 创建颜色处理器  
  pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color_handler(filtered_cloud, 255, 255, 255);  

  // 创建 PCLVisualizer 对象并显示点云  
  boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));  
  viewer->setBackgroundColor(0, 0, 0);  // 设置背景为黑色  
  viewer->addPointCloud<pcl::PointXYZ>(filtered_cloud, color_handler, "sample cloud");  
  viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");  
  viewer->addCoordinateSystem(1.0);  
  viewer->initCameraParameters();  
  
 // 旋转点云相机x轴朝向你  
  
  // 设置视图的上方向量为(0, 0, 1)  

  viewer->setCameraPosition(0, 0, 0, 5, 1, 1, 0, 0, 1);
 

  while (!viewer->wasStopped())  
  {  
    viewer->spinOnce(100);  // 使用 spinOnce 函数更新视图  
  }  
  XCloseDisplay(display);  
  return 0;  
}
